package com.leinao.project.dao;

import com.leinao.job.dto.JobTagDto;
import com.leinao.job.dto.PaiProjectJobDto;
import com.leinao.job.dto.ProjectJobViewDto;
import com.leinao.job.model.AiOrderUserCalculationPower;
import com.leinao.job.model.PaiTeamTaskRelation;
import com.leinao.model.model.Model;
import com.leinao.project.dto.*;
import com.leinao.project.model.PaiObjectFileRelation;
import com.leinao.project.model.PaiUserProjectRelation;
import com.leinao.project.model.Project;
import com.leinao.project.model.ProjectNotes;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 *
 * @Description 项目Dao
 * @author lizi
 * @date 2018/11/16 下午6:48
 * @Version 1.0
 */
@Repository
public interface ProjectMapper {

    /**
     * @Description 根据项目ID获取项目信息
     * @param id : 项目ID
     * @author lizi
     * @date 2018/11/16 下午5:18
     */
    Project getProject(Long id);

    /**
     * @Description 根据数据集ID获取使用该数据集的项目列表
     * @param datasetId : 数据集ID
     * @param userId : 用户ID
     * @author lizi
     * @date 2018/11/16 下午5:17
     */
    List<ProjectListDto> getProjectListByPrivateDatasetId(@Param("datasetId") Long datasetId,
                                                          @Param("userId") String userId);

    /**
     * @Description 根据数据集ID获取使用该数据集的项目列表
     * @param datasetId : 数据集ID
     * @param userId : 用户ID
     * @author lizi
     * @date 2018/11/16 下午5:17
     */
    List<PublicProjectListDto> getPublicProjectListByPublicDatasetId(@Param("datasetId") Long datasetId,
                                                         @Param("userId") String userId);


    /**
     * @Description 获取公开项目列表
     * @param sortType : 排序方式，参见com.leinao.constant.PublicProjectSortTypeEnum
     * @param categoryId : 分类ID
     * @author lizi
     * @date 2018/11/16 下午5:17
     */
    List<PublicProjectListDto> getPublicProjectList(@Param("sortType") Integer sortType, @Param("categoryId") Long categoryId);

    /**
     * @Description 公开项目统计
     * @author lizi
     * @date 2018/11/29 下午7:17
     */
    PublicProjectCollectDto getPublicProjectCollectInfo();

    /**
     * @Description 项目统计
     * @author lizi
     * @date 2018/11/29 下午7:17
     */
    ProjectCollectDto getProjectCollectInfo(@Param("userId") String userId);

    /**
     * @Description 更新项目公开开关
     * @param projectId : 项目ID
     * @param type : 类型(公开1、私有0)
     * @param now : 当前时间
     * @author lizi
     * @date 2018/11/16 下午5:18
     */
    int updateProjectTypeByProjectId(@Param("projectId") Long projectId, @Param("type") Integer type, @Param("now") Long now);

    /***
     * @Description 编辑项目参数
     * @param project : 项目信息
     * @author lizi
     * @date 2018/11/29 下午2:15
     */
    int editProjectTemplate(Project project);

    /***
     * @Description 编辑项目笔记
     * @param projectNotes : 笔记信息
     * @author lizi
     * @date 2018/11/29 下午2:15
     */
    int editProjectNotes(ProjectNotes projectNotes);

    /**
      * 功能描述：创建项目
      * @param project 项目信息
      * @return int
      * @Author: guoliangbo
      * @Date: 2019/5/7 13:45
      */
    Long createProject(Project project);

    /**
      * 功能描述：批量插入项目和数据集关系记录
      * @param list 项目和数据集关系列表
      * @return int 影响行数
      * @Author: guoliangbo
      * @Date: 2019/5/7 13:53
      */
	int batchInsertProjectDataSetRel(@Param("list") List<ProjectDataSetDto> list);

    /**
     *
     * 获取我的项目列表
     * @param userId 用户id
     * @param origin : 项目创建来源：null-所有，0-自己创建，1-复制
     * @return
     * @author wangshoufa
     * @date 2018年11月28日
     *
     */
	List<ProjectListDto> queryProjectList(@Param("userId") String userId, @Param("origin") Integer origin);

	/**
	  * 功能描述：根据项目id查询任务信息
	  * @param projectId 项目id
	  * @return java.util.List<com.leinao.job.dto.PaiProjectJobDto>
	  * @Author: guoliangbo
	  * @Date: 2019/5/7 13:52
	  */
	List<PaiProjectJobDto> getProjectJobInfo(@Param("projectId")Long projectId,@Param("jobTag")String jobTag);

	/**
	  * 功能描述：获取最大code
	  * @param projectId 项目id
	  * @return java.util.List<java.lang.Integer>
	  * @Author: guoliangbo
	  * @Date: 2019/5/7 13:52
	  */
	List<Integer> getMaxCodeNo(Long projectId);

	/**
	 * @Description 项目拷贝
	 * @param userProjectRelation : 用户项目关系
	 * @author lizi
	 * @date 2018/12/4 下午3:57
	 */
	void insertUserProjectRelation(PaiUserProjectRelation userProjectRelation);

    /**
     * @Description 根据用户ID和项目类型获取项目名称列表
     * @param projectType : 项目类型（com.leinao.constant.ProjectTypeEnum）
     * @param userId : 用户ID
     * @author lizi
     * @date 2019/01/16 下午5:17
     */
    List<String> getProjectNameListByUserIdAndProjectType(@Param("userId") String userId, @Param("projectType") Integer projectType);

    /**
     * 
     * 根据同一用户下项目名不可重复check是否可用
     * @param userId 用户id
     * @param projectName 项目名
     * @return 重复的项目名
     * @author wangshoufa 
     * @date 2019年2月20日
     *
     */
	String isUsable4Name(String userId, String projectName);

    /**
     * @Description 搜索公开项目列表
     * @param search : 搜索内容
     * @author lizi
     * @date 2019/02/26 下午5:17
     */
    List<PublicProjectListDto> searchPublicProjectList(@Param("search") String search);

    /**
      * 功能描述：编辑项目
      * @param project 项目信息
      * @return int 影响行数
      * @Author: guoliangbo
      * @Date: 2019/5/7 13:50
      */
	int editProject(Project project);

	/**
	  * 功能描述： 解除数据集和项目的老关系
	  * @param id 项目id
	  * @return int 影响行数
	  * @Author: guoliangbo
	  * @Date: 2019/5/7 13:50
	  */
	int deleteProjectDataSetRelByProjectId(Long id);

    /**
     * @Description 获取公开项目事例
     * @param projectId : 事例公开项目ID
     * @author lizi
     * @date 2019/03/13 下午5:17
     */
    PublicProjectExampleDto getPublicProjectExample(@Param("projectId") Long projectId);

	/**
	  * 功能描述 插入对象和文件关系记录
	  * @param pofr 对象和文件关系记录
	  * @return int 返回影响行数
	  * @Author: guoliangbo
	  * @Date: 2019/3/14 15:37
	  */
    int insertObjFileRelation(PaiObjectFileRelation pofr);

    /**
      * @Description    获取用户项目详情
      * @param projectId   项目Id
      * @return
      * @author:    weiwei
      * @Date:  2019/3/26 10:49
      */
    Project getUserProjectDetail(Long projectId);

    /**
      * @Description    获取任务详情
      * @param jobId  任务ID
      * @return
      * @author:    weiwei
      * @Date:  2019/3/27 13:42
      */
    ProjectJobViewDto getUserTaskDetail(Long jobId);

    /**
     * @Description  获取项目对应之前公开的项目ID
     * @param projectId
     * @author: suqiliang
     * @Date:  2019/5/7 13:42
     */
    Project getPublicProjectByRelation(@Param("projectId") Long projectId);

    /**
     * @Description  删除公开项目封面
     * @param projectId
     * @author: suqiliang
     * @Date:  2019/5/7 13:42
     */
    void deletePublicProjectCover(@Param("projectId") Long projectId);


	/**
	 *  根据参数查询项目信息
	 * @param projectId 项目id
	 * @param userId 用户id
	 * @return 返回任务信息
	 */
	List<ProjectInfoDto> getProjectsByParams(@Param("projectId")Long projectId,@Param("userId") String userId);

	/**
	  * 功能描述: 添加标签
	  * @param projectId
	  * @param jobId
	  * @param jobTag
	  * @param createTime
	  * @param updateTime
	  * @Return:int
	  * @Author:HuoPengfei
	  * @Date:2019/5/15 18:43
	  */
    int saveJobTag(@Param("projectId")Long projectId,@Param("jobId")Long jobId,@Param("userId")String userId,@Param("jobTag")String jobTag,@Param("createTime")Long createTime,@Param("updateTime")Long updateTime);
	/**
	  * 功能描述: 修改标签
	  * @param projectId
	  * @param jobId
	  * @param jobTag
	  * @param userId
	  * @Return:int
	  * @Author:HuoPengfei
	  * @Date:2019/5/15 18:43
	  */
    int updateJobTag(@Param("projectId")Long projectId,@Param("jobId")Long jobId,@Param("userId")String userId,@Param("jobTag")String jobTag);
    /**
      * 功能描述: 获取项目标签列表
      * @param projectId
      * @Return:java.util.List<java.lang.String>
      * @Author:HuoPengfei
      * @Date:2019/5/16 15:16
      */
    List<JobTagDto> getjobTagListByProId(@Param("projectId")Long projectId);
    /**
      * 功能描述: 获取项目标签列表
      * @param userId
      * @Return:java.util.List<java.lang.String>
      * @Author:HuoPengfei
      * @Date:2019/5/16 15:16
      */
    List<JobTagDto> getjobTagListByUserId(@Param("userId")String userId);

    /**
      * 功能描述: 获取数据集列表
      * @param userId
      * @Return:java.util.List<java.lang.Long>
      * @Author:HuoPengfei
      * @Date:2019/5/16 18:14
      */
	List<PrivateDataSetDto> getIdFindDataset(@Param("userId")String userId,@Param("id")Long id);

    /**
     * @Description 	根据任务ID查询任务公开条数
     * @param jobIds	任务Id集合
     * @return
     * @author:    weiwei
     * @Date:  2019/5/24 10:56
     */
    Integer getPublicJobCount(@Param("jobIds") List<String> jobIds);

    /**
     * @Description 	查询公开任务列表
     * @param jobIds	任务Ids
     * @return
     * @author:    weiwei
     * @Date:  2019/5/24 14:42
     */
    List<ProjectPublicJobDto> getPublicJobs(@Param("jobIds") List<String> jobIds);

    /**
     * 功能描述：插入项目和文件关系记录
     * @param projectId 项目id
     * @param publicHistoryId 公开项目历史表id
     * @return java.lang.Integer 影响行数
     * @Author: guoliangbo
     * @Date: 2019/5/27 20:34
     */
    Integer insertProjectFileRelationHistory(@Param("projectId")Long projectId, @Param("publicHistoryId")Long publicHistoryId);

    /**
     * 功能描述：插入数据集和项目关系记录
     * @param projectId 项目id
     * @param publicHistoryId 公开项目历史表id
     * @return java.lang.Integer 影响行数
     * @Author: guoliangbo
     * @Date: 2019/5/27 20:34
     */
    Integer insertProjectDatasetRelationHistory(@Param("projectId")Long projectId, @Param("publicHistoryId")Long publicHistoryId);

    /**
     * 功能描述：插入项目和类别关系记录
     * @param projectId 项目id
     * @param publicHistoryId 公开项目历史表id
     * @return java.lang.Integer 影响行数
     * @Author: guoliangbo
     * @Date: 2019/5/27 20:34
     */
    Integer insertProjectCategoryRelationHistory(@Param("projectId")Long projectId, @Param("publicHistoryId")Long publicHistoryId);
	
    /**
      * @Description 	插入项目模型关系
      * @param list	 模型关系
      * @return
      * @author:    weiwei
      * @Date:  2019/6/12 16:24
      */
	int batchInsertProjectModelRel(@Param("list") List<ProjectModelDto> list);

	/**
	 * @Description    获取最近新建的jupyter调试任务配置
	 * @param userId  任务名称
	 * @author:  lizi
	 * @Date:  2019/6/5 22:21
	 */
	String getLastJupyterJobConfig(@Param("userId") String userId);

	/**
	  * 功能描述：根据用户id和项目名查询私有模型
	  * @param userId 用户id
	  * @param id 项目id
	  * @return java.util.List<com.leinao.project.dto.ModelDto> 私有数据集
	  * @Author: guoliangbo
	  * @Date: 2019/6/6 15:32
	  */
  List<ModelDto> getPrivateModelByParams(@Param("userId")String userId, @Param("id")Long id);

	List<Model> getProjectUseModels(@Param("projectId")Long projectId);
	
	/**
	  * @Description 解除模型和项目关系
	  * @param projectId 项目Id
	  * @return
	  * @author:    weiwei
	  * @Date:  2019/6/12 16:29
	  */
	int deleteProjectModelRelByProjectId(@Param("projectId")Long projectId);

	/**
	 * @Description 判断是否存在项目名称
	 * @param projectName : 项目名称
	 * @param userId : 用户ID
	 * @author lizi
	 * @date 2019/06/18 下午5:17
	 */
	boolean existProjectName(@Param("projectName") String projectName, @Param("userId") String userId);

	/**
	  * 功能描述：查询任务和算力关系
	  * @param jobName 任务名
	  * @return com.leinao.job.model.PaiTeamTaskRelation 任务和团队关系记录
	  * @Author: guoliangbo
	  * @Date: 2019/9/27 15:16
	  */
    PaiTeamTaskRelation queryTeamTaskRelationByJobName(@Param("jobName")String jobName);

	/**
	  * 功能描述：查询用户剩余算力情况
	  * @param userId 用户id
	  * @return com.leinao.job.model.AiOrderUserCalculationPower
	  * @Author: guoliangbo
	  * @Date: 2019/9/27 15:32
	  */
	AiOrderUserCalculationPower queryAiOrderUserCalculationPower(@Param("userId")String userId);
}